/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.uccart_project.controller;

import com.uccart_project.model.Contrasenas;
import com.uccart_project.model.Curso;
import com.uccart_project.model.Estudiante;
import com.uccart_project.model.Materia;
import com.uccart_project.model.Nota;
import com.uccart_project.model.NotaPK;
import com.uccart_project.model.Padron;
import com.uccart_project.model.Periodo;
import com.uccart_project.model.Requisito;
import com.uccart_project.ui.forms.UI_Alumno;
import com.uccart_project.ui.forms.UI_Login;
import com.uccart_project.util.EntityManagerFactorySingleton;
import java.awt.GraphicsEnvironment;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author KNO
 */
public class Controller_Application {

    public static final String PANEL_LOGIN = "PanelLogin";
    public static final String PANEL_PRINCIPAL = "PanelPrincipal";
    public static final String PANEL_SELECCION_CURSO = "PanelSelecionCurso";
    public static final String PANEL_COBRO = "PanelCobro";
    public static final String PANEL_HISTORIAL = "PanelHistorial";
    public static final String PANEL_ESTADO_CUENTA = "PanelEstadoCuenta";
    public static final String PANEL_HORARIO = "PanelHorario";
    public static final String PANEL_INFORMACION = "PanelInformacion";
    private UI_Login uiLogin;
    private UI_Alumno uiAlumno;
    private Estudiante estudiante;
//    private ArrayList<String> codigosCarreras = new ArrayList<>();
    private ArrayList<Curso> cursosDisponibles;
    private ArrayList<Curso> cursosDisponiblesRequisitos;
    private ArrayList<Curso> cursosMatriculados;
    private ArrayList<Curso> cursoDisponibleCantidad;
    private ArrayList<Curso> cursoDisponiblePeriodo;
    private boolean yaSelecciono = false;
    private DefaultComboBoxModel modelJComboBoxSeleccionar;
    private boolean esMatricula = false;
    private Periodo periodo;

    public Controller_Application() {

        this.uiLogin = new UI_Login(this);
        //this.uiAlumno = new UI_Alumno(this);


    }

    public void iniciar() {
        this.uiLogin.setVisible(true);
        //uiAlumno.setVisible(true);
    }

    public void cerrarSession() {
        EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
        em.getEntityManagerFactory().getCache().evictAll();
        this.yaSelecciono = false;
        this.modelJComboBoxSeleccionar = null;
        this.estudiante = null;
        this.uiLogin = new UI_Login(this);
        this.uiAlumno.dispose();
//        this.uiLogin.resetInputs();
        this.uiLogin.setVisible(true);
        this.esMatricula = false;
        this.uiAlumno = null;

    }

//    public void mostrarMenuPrincipal() {
//
//        this.uiLogin.dispose();
//        this.uiAlumno.setVisible(true);
//    }
    public void crearMenuPrincipal() {
        this.uiAlumno = new UI_Alumno(this);
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        this.uiAlumno.setMaximizedBounds(env.getMaximumWindowBounds());
        this.uiAlumno.setExtendedState(uiLogin.getExtendedState() | JFrame.MAXIMIZED_BOTH);
        this.setPeriodo();
        this.revisarPeriodo();
        this.cursosDisponibles = new ArrayList<>();
        this.cursosDisponiblesRequisitos = new ArrayList<>();
        this.cursosMatriculados = new ArrayList<>();
        this.cursoDisponibleCantidad = new ArrayList<>();
        this.cursoDisponiblePeriodo = new ArrayList<>();
        this.uiLogin.dispose();
        this.uiAlumno.setVisible(true);
    }

    private void setPeriodo() {

        EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
        em.getTransaction().begin();
        List result = em.createNamedQuery("Periodo.getLast").getResultList();
        em.getTransaction().commit();
        em.close();
        periodo = (Periodo) result.get(0);
    }

    private void revisarPeriodo() {

        Date server = getFechaServidor();
        Date per = this.periodo.getPerWeb();

        if (per.before(server)) {
            System.out.println("si es periodo");
            esMatricula = true;
        }

    }

    private Date getFechaServidor() {
        EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
        Query q = em.createNativeQuery("SELECT current_timestamp;");
        return (Date) q.getResultList().get(0);
    }

    public void mostrarMatricula() {
        this.uiAlumno.cambiarPanel(PANEL_SELECCION_CURSO);
    }

    public void mostrarCobro() {
        this.uiAlumno.cambiarPanel(PANEL_COBRO);
    }

    public void mostrarEstadoCuenta() {
        this.uiAlumno.cambiarPanel(PANEL_ESTADO_CUENTA);
    }

    public void mostrarHistorial() {
        this.uiAlumno.cambiarPanel(PANEL_HISTORIAL);
    }

    public void mostrarHorario() {
        this.uiAlumno.cambiarPanel(PANEL_HORARIO);
    }

    public void mostrarPanelPrincipal() {
        this.uiAlumno.cambiarPanel(PANEL_PRINCIPAL);
    }

    public void mostrarPanelLogin() {
        this.uiAlumno.cambiarPanel(PANEL_PRINCIPAL);
    }

    public void mostrarPanelInformacion() {
        this.uiAlumno.cambiarPanel(PANEL_INFORMACION);
    }

    public void verificarUsuario(String id, String password) {
        this.uiLogin.setEnabled(false);
        try {
            System.out.println("verificarUsuario " + id + password);
            EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
            em.getTransaction().begin();
            em.flush();
            this.estudiante = em.find(Estudiante.class, id);
            em.getTransaction().commit();
            em.close();
            if (estudiante != null) {
                if (estudiante.getContrasenas().getContPw().equals(password)) {

                    crearMenuPrincipal();
                } else {
                    JOptionPane.showMessageDialog(uiLogin, "Usuario o contraseña invalidos", "ERROR", 0, new javax.swing.ImageIcon(getClass().getResource("/com/uccart_project/ui/iconos/Notificacion.png")));
                }
            } else {
                JOptionPane.showMessageDialog(uiLogin, "Usuario o contraseña invalidos", "ERROR", 0, new javax.swing.ImageIcon(getClass().getResource("/com/uccart_project/ui/iconos/Notificacion.png")));
            }

        } catch (Exception e) {
            System.out.println("verificarUsuario " + e.toString());
            JOptionPane.showMessageDialog(uiLogin, "Error al intentar conectar a la base de datos", "ERROR", 0, new javax.swing.ImageIcon(getClass().getResource("/com/uccart_project/ui/iconos/Notificacion.png")));
        }
        System.out.println("verificarUsuario " + id + password);
        this.uiLogin.setEnabled(true);
    }

    private void clearTableModelHorario(DefaultTableModel model) {

        for (int column = 1; column < model.getColumnCount(); column++) {

            for (int row = 0; row < model.getRowCount(); row++) {
//                System.out.println("antes " + model.getValueAt( row, column) );
                model.setValueAt(null, row, column);
//                                System.out.println("despues " + model.getValueAt( row, column)  );

            }
        }


    }

    public void getCursos(DefaultTableModel model) {
        System.out.println("getCursos");
        this.clearTableModelHorario(model);
        EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
        em.getEntityManagerFactory().getCache().evictAll();
         
// Inicio de transacción
        em.getTransaction().begin();
        em.flush();
        List result = em.createNamedQuery("Nota.findByNotaCodestudianteCondicion").setParameter("notaCodestudiante", estudiante.getEstId()).getResultList();
         Estudiante es = em.find(Estudiante.class, estudiante.getEstId());
        em.getTransaction().commit();
        em.close();
//        ArrayList<Nota> notas = new ArrayList<>(result);
        ArrayList<Nota> notas = new ArrayList<>(es.getNotaList());
         System.out.println("getCursos "+notas.size());
        String hora;
        String minuto;
        int row;
        int min;
        for (Nota nota : notas) {
            
            if (nota.getNotaCondicion() == 0) {
                SimpleDateFormat sdf = new SimpleDateFormat("HH");
                hora = sdf.format(nota.getCurso().getCursoDia1inicio());
                row = Integer.parseInt(hora) - 8;
                sdf = new SimpleDateFormat("mm");
                minuto = sdf.format(nota.getCurso().getCursoDia1inicio());
                min = Integer.parseInt(minuto);
                if (min == 30) {
                    row++;
                }
                if (row < 25 && row > -1) {
                    model.setValueAt(nota.getCurso().getCursoId() + " " + nota.getCurso().getCursoCodmateria().getMateriaNombre(), row, nota.getCurso().getCursoDia1());
                    model.setValueAt(nota.getCurso().getCursoId() + " " + nota.getCurso().getCursoCodmateria().getMateriaNombre(), row + 1, nota.getCurso().getCursoDia1());
                    model.setValueAt(nota.getCurso().getCursoId() + " " + nota.getCurso().getCursoCodmateria().getMateriaNombre(), row + 2, nota.getCurso().getCursoDia1());
                    model.setValueAt(nota.getCurso().getCursoId() + " " + nota.getCurso().getCursoCodmateria().getMateriaNombre(), row + 3, nota.getCurso().getCursoDia1());

                }
            }
        }
    }

    public ArrayList<Nota> getNotaListAprobados() {
        ArrayList<Nota> notasAprobadas = new ArrayList<>();
        ArrayList< Nota> notas = new ArrayList<>(estudiante.getNotaList());
        for (Nota nota : notas) {
            if (nota.getNotaCondicion() == 1) {
                notasAprobadas.add(nota);
            }
        }
        return notasAprobadas;
    }

    // version 2
    public void getCursosDisponibles2(DefaultTableModel model, int carreraPos) {
        if (!yaSelecciono) {
            this.modelJComboBoxSeleccionar.removeElementAt(0);
            yaSelecciono = true;
            carreraPos--;
        }
        model.setRowCount(0);
        cursosDisponibles.clear();
        cursosDisponiblesRequisitos.clear();
        cursoDisponibleCantidad.clear();
        cursoDisponiblePeriodo.clear();

        List result = estudiante.getPadronList();
        ArrayList<Padron> padrones = new ArrayList<>(result);

        ArrayList< Materia> materias = new ArrayList<>(padrones.get(carreraPos).getPadCodcarr().getMateriaList());
        int n = 0;
        for (Materia materia : materias) {
            this.getCursosFromNotas(materia);
        }
        filtrarDisponiblesPorPeriodo();
        filtrarDisponiblesPorRequisitos();

        filtrarDisponiblesPorCupo();
        for (Curso curso : cursoDisponibleCantidad) {
            model.addRow(new Object[]{curso.getCursoCodmateria().getMateriaNombre(),
                curso.getCursoAula(), this.getNombreDia(curso.getCursoDia1()),
                this.getHour(curso.getCursoDia1inicio()), this.getHour(curso.getCursoDia1final())});
        }

    }

    private void getCursosFromNotas(Materia materia) {
//        System.out.println("getCursosFromNotas "  );
        ArrayList<Curso> cursos = new ArrayList<>(materia.getCursoList());
//        System.out.println("cursos " + cursos.toString());
        int n = 0;
        for (Curso curso : cursos) {
//            System.out.println("n " + ++n);
//            System.out.println("getCursosFromNotas  " + curso.getCursoCodmateria().getMateriaNombre() +curso.getCursoId());
            if (curso.getNotaList().isEmpty()) {
//                System.out.println(" if " );
                cursosDisponibles.add(curso);

            } else if (curso.getNotaList().get(0).getNotaCondicion() == 2) {
//                System.out.println(" else " );
                cursosDisponibles.add(curso);
            }
        }
    }

    private void getCursosMatriculados(DefaultTableModel model) {
        this.cursosMatriculados.clear();
        model.setRowCount(0);
        ArrayList<Nota> notas = new ArrayList<>(estudiante.getNotaList());
        for (Nota nota : notas) {
            if (nota.getNotaCondicion() == 0) {
                this.cursosMatriculados.add(nota.getCurso());
                model.addRow(new Object[]{nota.getCurso().getCursoCodmateria().getMateriaNombre(),
                    nota.getCurso().getCursoAula(), this.getNombreDia(nota.getCurso().getCursoDia1()),
                    this.getHour(nota.getCurso().getCursoDia1inicio()), this.getHour(nota.getCurso().getCursoDia1final())});
            }
        }
    }

    private void filtrarDisponiblesPorPeriodo() {

        String idPeriodo = periodo.getPerPeriodo();

        for (Curso curso : cursosDisponibles) {
            if (idPeriodo.equals(curso.getCursoPeriodo().getPerPeriodo())) {
                cursoDisponiblePeriodo.add(curso);
            }
        }
    }

    private void filtrarDisponiblesPorRequisitos() {
        for (Curso curso : cursoDisponiblePeriodo) {
            if (curso.getCursoCodmateria().getRequisitoList().isEmpty()) {
                cursosDisponiblesRequisitos.add(curso);
            } else {
//                System.out.println("curso con requisitos " + curso.getCursoCodmateria().getMateriaNombre());
                if (tieneRequisitosAprovados(curso.getCursoCodmateria().getRequisitoList())) {
                    cursosDisponiblesRequisitos.add(curso);
                }
            }
        }
    }

    private void filtrarDisponiblesPorCupo() {
        for (Curso curso : cursosDisponiblesRequisitos) {
            if (curso.getCursoCantactual() < curso.getCursoCantmax()) {
                cursoDisponibleCantidad.add(curso);
            }
        }
    }

    private boolean tieneRequisitosAprovados(List<Requisito> requisitos) {

        ArrayList<Requisito> requisitosl = new ArrayList<>(requisitos);

        for (Requisito requisito : requisitosl) {
            if (tieneRequisitosAprovadosComparacion(requisito.getReqRequisito().getMateriaId())) {
                System.out.println("tieneRequisitosAprovados " + requisito.getReqRequisito().getMateriaId());

                return true;
            }
        }
        return false;
    }

    private boolean tieneRequisitosAprovadosComparacion(String materiaId) {

        ArrayList<Nota> notas = getNotaListAprobados();
        for (Nota nota : notas) {
            if (materiaId.equals(nota.getCurso().getCursoCodmateria().getMateriaId())) {
                return true;
            }
        }
        return false;
    }

//    private void setCursosFromMateria(Materia materia, DefaultTableModel model) {
//        ArrayList<Curso> cursos = new ArrayList<>(materia.getCursoList());
//        for (Curso curso : cursos) {
//            if (curso.getNotaList().isEmpty()) {
//                model.addRow(new Object[]{curso.getCursoCodmateria().getMateriaNombre(), curso.getCursoAula(), this.getNombreDia(curso.getCursoDia1()), this.getHour(curso.getCursoDia1inicio()), this.getHour(curso.getCursoDia1final())});
//                break;
//            } else if (curso.getNotaList().get(0).getNotaCondicion() == 2) {
//                model.addRow(new Object[]{curso.getCursoCodmateria().getMateriaNombre(), curso.getCursoAula(), this.getNombreDia(curso.getCursoDia1()), this.getHour(curso.getCursoDia1inicio()), this.getHour(curso.getCursoDia1final())});
//                System.out.println("asdasdasdasdasddasdasdas");
//            }
//        }
//    }
    private String getHour(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        return sdf.format(date);
    }

    private String getNombreDia(int dia) {
        String diat = "Lunes";
        switch (dia) {
            case 2: {
                diat = "Martes";
                break;
            }
            case 3: {
                diat = "Miercoles";
                break;
            }
            case 4: {
                diat = "Jueves";
                break;
            }
            case 5: {
                diat = "Viernes";
                break;
            }
            case 6: {
                diat = "Sabado";
                break;
            }
            case 7: {
                diat = "Domingo";
                break;
            }
        }
        return diat;
    }

    public boolean updateDatosPersonal(String celular, String telefono, String correo, String direccion, String trabajo) {
        try {
            EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
            em.getTransaction().begin();
            estudiante.setEstCelular(Integer.parseInt(celular));
            estudiante.setEstTelefono(Integer.parseInt(telefono));
            estudiante.setEstCorreo(correo);
            estudiante.setEstDireccion(direccion);
            estudiante.setEstTrabajo(trabajo);
            em.merge(estudiante);
            em.getTransaction().commit();
            em.close();
        } catch (Exception e) {
            System.out.println("updateDatosPersonal " + e.toString());
            return false;
        }
        return true;
    }

    public boolean updateContrasena(String nueva) {
        try {
            EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
            em.getTransaction().begin();
            Contrasenas contrasena = estudiante.getContrasenas();
            contrasena.setContPw(nueva);
            em.merge(contrasena);
            em.getTransaction().commit();
            em.close();
        } catch (Exception e) {
            System.out.println("updateContrasena " + e.toString());
            return false;
        }
        return true;
    }

    public boolean coinciden(String antigua) {
        System.out.println(antigua);
        return estudiante.getContrasenas().getContPw().equals(antigua);
    }

    public void getCursosNotas(DefaultTableModel model) {

        EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
        // Inicio de transacción
        em.getTransaction().begin();
        List result = em.createNamedQuery("Nota.findByNotaCodestudiante").setParameter("notaCodestudiante", estudiante.getEstId()).getResultList();
        em.getTransaction().commit();
        em.close();
        ArrayList<Nota> notas = new ArrayList<>(result);
        for (Nota nota : notas) {
            model.addRow(new Object[]{nota.getCurso().getCursoPeriodo().getPerPeriodo(), nota.getCurso().getCursoId(), nota.getCurso().getCursoCodmateria().getMateriaNombre(), nota.getCurso().getCursoCodmateria().getMateriaCreditos(), nota.getNotaPromedio()});
        }
    }

    /*private int filaEnTabla(String hora) {

     String h = hora.split(":")[0];
     System.out.println(Integer.parseInt(h));
     return Integer.parseInt(h);
     }*/
    /*Para rellenar el estudiante en cueta
     * 
     */
    public String getEstudianteCelular() {

        return this.estudiante.getEstCelular().toString();
    }

    public String getEstudianteTelefono() {

        return this.estudiante.getEstTelefono().toString();
    }

    public String getEstudianteCorreo() {
        return this.estudiante.getEstCorreo().toString();
    }

    public String getEstudianteDireccion() {
        return this.estudiante.getEstDireccion();
    }

    public String getEstudianteTrabajo() {
        return this.estudiante.getEstTrabajo();
    }

    public void fillSeleccionarCarrera(DefaultComboBoxModel model) {

        this.modelJComboBoxSeleccionar = model;

        System.out.println("fillSeleccionarCarrera 1");

        List result = estudiante.getPadronList();
        ArrayList<Padron> notas = new ArrayList<>(result);
        model.addElement(" Seleccione una Carrera ");
        for (Padron carrera : notas) {

            model.addElement(carrera.getPadCodcarr().getCarrNombre());
            System.out.println("cantidad maxima de creditos " + carrera.getPadCodcarr().getCarrCredmax());
//            codigosCarreras.add(carrera.getPadCodcarr().getCarrCod());
//            
        }
        System.out.println("fillSeleccionarCarrera 2");

    }

    public void fillTablaMatriculados(DefaultTableModel modelTableMatriculados) {
        this.getCursosMatriculados(modelTableMatriculados);

    }

    public int validacionAgregar(int selectedRow, int selectedCar) {
        Curso aMatricular = cursoDisponibleCantidad.get(selectedRow);


        if (!validacionCurso(aMatricular)) {
            return 1;
        } else if (!validacionHorario(aMatricular)) {
            return 2;
        }else if (!validacionCreditos(aMatricular, selectedCar)) {
            return 3;
        }

        return 0;
    }
    
    public boolean validacionCreditos(Curso aMatricular, int carr){
        List result = estudiante.getPadronList();
        ArrayList<Padron> carrs = new ArrayList<>(result);
        int carrcred = carrs.get(carr).getPadCodcarr().getCarrCredmax();
        int cont = 0;
        for(Curso cur: cursosMatriculados){          
            System.out.println("..............................");
            if((aMatricular.getCursoCodmateria().getMateriaCodcarrera().getCarrCod()).equals(cur.getCursoCodmateria().getMateriaCodcarrera().getCarrCod())){
                cont = cont + cur.getCursoCodmateria().getMateriaCreditos();
                if((cont + aMatricular.getCursoCodmateria().getMateriaCreditos()) > carrcred){
                    System.out.println("Creds: " + carrcred);
                    return false;
                }
            }
        }
        return true;
    }

    private boolean validacionCurso(Curso aMatricular) {

        for (Curso curso : cursosMatriculados) {
            if (aMatricular.getCursoCodmateria().getMateriaId().equals(curso.getCursoCodmateria().getMateriaId())) {
                return false;
            }
        }
        return true;
    }

    private boolean validacionHorario(Curso aMatricular) {
        int dia = aMatricular.getCursoDia1();
        DateFormat dateFormat = new SimpleDateFormat("HH:mm");
        Date horaIni;
        Date horaFin;
        Date horaIni2;
        Date horaFin2;
        String format;
        Calendar cal = Calendar.getInstance();


        try {
            format = dateFormat.format(aMatricular.getCursoDia1inicio());
            horaIni = dateFormat.parse(format);
            format = dateFormat.format(aMatricular.getCursoDia1final());
            horaFin = dateFormat.parse(format);

        } catch (Exception ex) {
            System.out.println("validacionHorario1 " + ex.toString());
            return false;
        }
        for (Curso curso : cursosMatriculados) {
            System.out.println("aqui estoy " + curso.getCursoDia1());
            if (curso.getCursoDia1() == dia) {
                System.out.println("aqui estoy");
                try {
                    format = dateFormat.format(curso.getCursoDia1inicio());
                    horaIni2 = dateFormat.parse(format);
                    format = dateFormat.format(curso.getCursoDia1final());
                    horaFin2 = dateFormat.parse(format);
                    cal.setTime(horaFin2);
                    cal.add(Calendar.MINUTE, -10);
                    horaFin2 = cal.getTime();
                    format = dateFormat.format(horaFin2);
                    horaFin2 = dateFormat.parse(format);
                    System.out.println("hora " + horaFin2.toString());

                    if ((horaIni.after(horaIni2) && horaFin2.before(horaIni)) || (horaIni.after(horaFin2) && horaFin2.before(horaFin))) {
                    } else {
                        return false;
                    }

                } catch (Exception ex) {
                    System.out.println("validacionHorario2 " + ex.toString());
                    return false;
                }
            }
        }
        return true;
    }

    public boolean agregarMatriculados(int selectedRow) {

        if (matricular(cursoDisponibleCantidad.get(selectedRow))) {
            cursosMatriculados.add(cursoDisponibleCantidad.get(selectedRow));
            cursoDisponibleCantidad.remove(selectedRow);

        } else {
            return false;
        }
        return true;
    }

    public boolean matricular(Curso curso) {
        try {
            EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
            em.getTransaction().begin();
            NotaPK notapk = new NotaPK();
            notapk.setNotaCodestudiante(estudiante.getEstId());
            notapk.setNotaCodcurso(curso.getCursoId());
            Nota nota = new Nota();
            nota.setNotaPK(notapk);
            nota.setNotaCondicion(0);
            em.persist(nota);
            em.flush();
            em.getTransaction().commit();
            em.close();
        } catch (Exception e) {
            System.out.println("matricular " + e.toString());
            return false;
        }
        return true;
    }

    public boolean agregarDisponibles(int selectedRow) {

        if (desMatricular(cursosMatriculados.get(selectedRow))) {
            cursoDisponibleCantidad.add(cursosMatriculados.get(selectedRow));
            cursosMatriculados.remove(selectedRow);

        } else {
            return false;
        }
        return true;
    }

    public boolean desMatricular(Curso curso) {
        try {
            EntityManager em = EntityManagerFactorySingleton.getFactory().createEntityManager();
            em.getTransaction().begin();
            NotaPK notapk = new NotaPK();
            notapk.setNotaCodestudiante(estudiante.getEstId());
            notapk.setNotaCodcurso(curso.getCursoId());
            Nota nota = em.find(Nota.class, notapk);

            em.merge(nota);
            em.remove(nota);
            em.flush();
            em.getTransaction().commit();
            em.close();
        } catch (Exception e) {
            System.out.println("desMatricular " + e.toString());
            return false;
        }
        return true;
    }

    public boolean esMatricula() {

        return esMatricula;
    }

    public String getEstInfo() {
        return this.estudiante.getEstId() + "  " + estudiante.getEstNombre() + " " + estudiante.getEstApellido1() + "  " + estudiante.getEstApellido2();
    }
}
